import sys
# 正确的方式
import datetime

from PyQt5 import QtWidgets
from PyQt5.QtCore import QDate, Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox

from main_ui import Ui_MainWindow


class MainApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()  # 初始化主界面
        self.ui.setupUi(self)
        self.init_ui()

    def init_ui(self):
        # 在设置表头之后添加以下代码
        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed)  # 平台列固定宽度
        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(1, QtWidgets.QHeaderView.Fixed)  # 价格列固定宽度
        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch)  # 链接列拉伸填充
        tomorrow = QDate.currentDate().addDays(1)
        self.ui.entry_dateEdit.setDate(tomorrow)
        self.ui.clear_pushButton.setShortcut(Qt.Key_F1)
        self.ui.pushButton.setShortcut(Qt.Key_F2)
        self.ui.auto_open_url_checkBox.setShortcut(Qt.Key_F3)
        self.ui.clear_pushButton.clicked.connect(self.clear_all_inputs)
        self.ui.pushButton.clicked.connect(self.calculate_ticket_prices)

    def clear_all_inputs(self):
        """
        这个函数用于清除所有指定的输入控件内容。
        """
        # 1. 清除 QTextEdit 或 QLineEdit
        self.ui.name_textEdit.clear()
        self.ui.card_id_textEdit.clear()
        print("文本框内容已清除。")  # 在控制台打印信息以便调试

        # 2. 清空 QTableWidget
        self.ui.tableWidget.clearContents()
        print("表格已清空。")

    def calculate_ticket_prices(self):
        """
        处理查价按钮点击事件的核心函数。
        """
        # 1. 获取输入
        id_numbers_text = self.ui.card_id_textEdit.toPlainText()
        entry_date = self.ui.entry_dateEdit.date()  # 获取QDate对象

        if not id_numbers_text.strip():
            QMessageBox.warning(self, "输入错误", "请输入至少一个身份证号码！")
            return

        # 2. 初始化计数器
        adult_count = 0
        child_count = 0
        senior_count = 0
        free_count = 0
        invalid_count = 0

        # 3. 解析和处理身份证列表
        id_list = id_numbers_text.strip().splitlines()

        for id_number in id_list:
            id_number = id_number.strip()
            if not id_number:
                continue

            # 3.1 验证身份证格式并提取出生日期
            if len(id_number) != 18 or not id_number[:-1].isdigit() or not id_number[-1].upper() in '0123456789X':
                invalid_count += 1
                continue

            try:
                birth_year = int(id_number[6:10])
                birth_month = int(id_number[10:12])
                birth_day = int(id_number[12:14])
                # 简单验证日期合法性
                datetime.date(birth_year, birth_month, birth_day)
            except ValueError:
                invalid_count += 1
                continue

            # 3.2 计算在入园当天的准确年龄
            age = self.calculate_age(birth_year, birth_month, birth_day, entry_date)

            # 3.3 根据年龄判断票型
            if age < 3:
                free_count += 1
            elif age <= 11:  # 3-11岁
                child_count += 1
            elif age <= 59:  # 12-59岁
                adult_count += 1
            else:  # 60岁及以上
                senior_count += 1

        # 4. 构建并显示结果
        result_message = f"""门票类型统计结果：

        成人票 (12-59周岁): {adult_count} 人
        儿童票 (3-11周岁): {child_count} 人
        长者票 (60周岁及以上): {senior_count} 人
        免票 (3周岁以下): {free_count} 人
        ---------------------------------
        无效或格式错误的身份证: {invalid_count} 个
        """
        QMessageBox.information(self, "查价结果", result_message)

    def calculate_age(self, birth_year, birth_month, birth_day, target_date: QDate):
        """
        根据出生日期和目标日期，计算准确的周岁。
        """
        target_year = target_date.year()
        target_month = target_date.month()
        target_day = target_date.day()

        age = target_year - birth_year
        # 如果目标日期的月日还没到生日的月日，年龄减1
        if (target_month, target_day) < (birth_month, birth_day):
            age -= 1
        return age

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_window = MainApp()
    main_window.show()
    sys.exit(app.exec_())
